//import {log} from './levy';
//log('数值扩展Number');
var log = (msg) => console.log(msg);
log(typeof Number);//居然是function
log(Number.EPSILON);
log(Number.EPSILON.toFixed(20));

//Number.EPSILON的实质是一个可以接受的误差范围。
function withinErrorMargin (left, right) {
  return Math.abs(left - right) < Number.EPSILON;
}

//Math.trunc方法用于去除一个数的小数部分，返回整数部分。
log(Math.trunc(4.7));
log(Math.trunc(-4.7));

//ES7新增了一个指数运算符（**），目前Babel转码器已经支持。
//log( 2 ** 2);


log('array ......');
//Array.from方法用于将两类对象转为真正的数组：类似数组的对象（array-like object）和可遍历（iterable）的对象

// NodeList对象
//let ps = document.querySelectorAll('p');
//Array.from(ps).forEach(function (p) {
//  console.log(p);
//});

// arguments对象
function foo() {
  var args = Array.from(arguments);
  // ...
}

log('Array.from');
//所谓类似数组的对象，本质特征只有一点，即必须有length属性。因此，任何有length属性的对象，都可以通过Array.from方法转为数组
Array.from({ length: 3 });
// [ undefined, undefined, undefinded ]

// Array.from还可以接受第二个参数，作用类似于数组的map方法，用来对每个元素进行处理，将处理后的值放入返回的数组。
Array.from([1, , 2, , 3], (n) => n || 0)
// [1, 0, 2, 0, 3]
Array.from({ length: 2 }, () => 'jack')
// ['jack', 'jack']
Array.from({ length: 2 }, () => 'jack', this);//第三个参数还可以传this?
//Array.from()可以将各种值转为真正的数组，并且还提供map功能。这实际上意味着，只要有一个原始的数据结构，你就可以先对它的值进行处理，然后转成规范的数组结构
//Array.from()的另一个应用是，将字符串转为数组，然后返回字符串的长度。因为它能正确处理各种Unicode字符，可以避免JavaScript将大于\uFFFF的Unicode字符，算作两个字符的bug。也可以用spred运算符 ...
log('计算字符串的长度');
function countSymbols(string) {
  return Array.from(string).length;
}
//注意字符串的为第一个参数的输出结果
log(Array.from('hello'));
// ['h', 'e', 'l', 'l', 'o']

log(Array.of('Array.of()'));
log(Array.of('hello'));
//Array.of 方法的主要目的，是弥补数组构造函数Array()的不足。
//Array() 只有当参数个数不少于2个时，Array()才会返回由参数组成的新数组。参数个数只有一个时，实际上是指定数组的长度。
Array(3) // [, , ,]
//Array.of基本上可以用来替代Array()或new Array()

//数组实例的find方法，用于找出第一个符合条件的数组成员。它的参数是一个回调函数，所有数组成员依次执行该回调函数，直到找出第一个返回值为true的成员，然后返回该成员。如果没有符合条件的成员，则返回undefined。
log('Array.find()');
[1, 5, 10, 15].find(function(value, index, arr) {
  return value > 9;
}) // 10

log('fill方法使用给定值，填充一个数组。');
['a', 'b', 'c'].fill(7);
// [7, 7, 7]

new Array(3).fill(7);
// [7, 7, 7]

//fill方法还可以接受第二个和第三个参数，用于指定填充的起始位置和结束位置。
log(['a', 'b', 'c'].fill(7,1,2));//方法从1号位开始，向原数组填充7，到2号位之前结束。
// ['a', 7, 'c']

// ES6提供三个新的方法——entries()，keys()和values()——用于遍历数组,可以用for...of循环进行遍历
log('数组方法: entries() keys() values()')
for (let index of ['a', 'b'].keys()) {
  console.log(index);
}
// 0
// 1

console.error('这里运行不通过: values() is not a function')
//for (let elem of ['a', 'b'].values()) {
//  console.log(elem);
//}
// 'a'
// 'b'

for (let [index, elem] of ['a', 'b'].entries()) {
  console.log(index, elem);
}
// 0 "a"
// 1 "b"

log('数组的空位...注意这个与在浏览器表现是不一致的');
log(new Array(3));
log('由于空位的处理规则非常不统一，所以建议避免出现空位。');

//forEach(), filter(), every() 和some()都会跳过空位。 map()会跳过空位，但会保留这个值 join()和toString()会将空位视为undefined，而undefined和null会被处理成空字符串
